package com.edu.exam.entity.examination.online;

import com.edu.exam.enums.system.RiskLevel;
import com.edu.exam.enums.examination.MonitoringType;
import com.edu.exam.enums.examination.ViolationType;
import com.edu.exam.enums.examination.MonitoringStatus;
import com.edu.exam.enums.examination.HandlingStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 安全监控实体类
 *
 * <p>安全监控实体用于记录考试会话过程中的安全监控数据，包括环境监控、
 * 行为分析、风险评估、违规检测等。确保考试的公平性和安全性。</p>
 *
 * <p>核心功能：
 * - 环境监控：监控考试环境的变化和异常情况
 * - 行为分析：分析学生的考试行为模式
 * - 风险评估：评估安全风险和威胁等级
 * - 违规检测：检测作弊行为和违规操作
 * - 告警管理：生成和管理安全告警信息</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
@EntityListeners(AuditingEntityListener.class)
public class SecurityMonitoring {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 会话ID
     *
     * <p>关联的考试会话ID，标识监控记录所属的会话。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32)
    private String sessionId;

    /**
     * 学生ID
     *
     * <p>监控的学生ID。</p>
     */
    @Column(name = "student_id", nullable = false, length = 32)
    private String studentId;

    /**
     * 学生姓名
     *
     * <p>监控的学生姓名，冗余存储。</p>
     */
    @Column(name = "student_name", nullable = false, length = 100)
    private String studentName;

    /**
     * 监控ID
     *
     * <p>监控记录的唯一标识符。</p>
     */
    @Column(name = "monitoring_id", nullable = false, length = 32, unique = true)
    private String monitoringId;

    /**
     * 监控类型
     *
     * <p>监控的类型标识。
     * 支持的类型：ENVIRONMENT（环境）、BEHAVIOR（行为）、NETWORK（网络）、
     * DEVICE（设备）、PROCESS（进程）、SCREEN（屏幕）等</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "monitoring_type", nullable = false, length = 30)
    private MonitoringType monitoringType;

    /**
     * 监控子类型
     *
     * <p>监控的子类型，用于更精细的分类。</p>
     */
    @Column(name = "monitoring_subtype", length = 50)
    private String monitoringSubtype;

    /**
     * 监控时间
     *
     * <p>监控记录的时间。</p>
     */
    @Column(name = "monitoring_time", nullable = false)
    private LocalDateTime monitoringTime;

    /**
     * 风险级别
     *
     * <p>监控结果的风险级别。
     * 支持的级别：NONE（无）、LOW（低）、MEDIUM（中）、HIGH（高）、CRITICAL（严重）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "risk_level", nullable = false, length = 20)
    private RiskLevel riskLevel = RiskLevel.NONE;

    /**
     * 风险评分
     *
     * <p>风险评分，范围0-100。</p>
     */
    @Column(name = "risk_score")
    private Integer riskScore = 0;

    /**
     * 监控数据
     *
     * <p>监控收集的数据，JSON格式。</p>
     */
    @Column(name = "monitoring_data", columnDefinition = "TEXT")
    private String monitoringData;

    /**
     * 异常描述
     *
     * <p>监控发现的异常情况描述。</p>
     */
    @Column(name = "anomaly_description", columnDefinition = "TEXT")
    private String anomalyDescription;

    /**
     * 异常代码
     *
     * <p>异常情况的标准化代码。</p>
     */
    @Column(name = "anomaly_code", length = 50)
    private String anomalyCode;

    /**
     * 违规类型
     *
     * <p>如果检测到违规，记录违规类型。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "violation_type", length = 50)
    private ViolationType violationType;

    /**
     * 违规描述
     *
     * <p>违规行为的详细描述。</p>
     */
    @Column(name = "violation_description", columnDefinition = "TEXT")
    private String violationDescription;

    /**
     * 监控状态
     *
     * <p>监控的状态。
     * 支持的状态：ACTIVE（活跃）、WARNING（警告）、ALERT（告警）、BLOCKED（阻止）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "monitoring_status", nullable = false, length = 20)
    private MonitoringStatus monitoringStatus = MonitoringStatus.ACTIVE;

    /**
     * 处理状态
     *
     * <p>异常或违规的处理状态。
     * 支持的状态：PENDING（待处理）、REVIEWING（审核中）、RESOLVED（已解决）、IGNORED（已忽略）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "handling_status", length = 20)
    private HandlingStatus handlingStatus = HandlingStatus.PENDING;

    /**
     * 处理时间
     *
     * <p>异常或违规的处理时间。</p>
     */
    @Column(name = "handling_time")
    private LocalDateTime handlingTime;

    /**
     * 处理者ID
     *
     * <p>处理监控异常的操作者ID。</p>
     */
    @Column(name = "handler_id", length = 32)
    private String handlerId;

    /**
     * 处理者姓名
     *
     * <p>处理监控异常的操作者姓名。</p>
     */
    @Column(name = "handler_name", length = 100)
    private String handlerName;

    /**
     * 处理结果
     *
     * <p>异常或违规的处理结果。</p>
     */
    @Column(name = "handling_result", columnDefinition = "TEXT")
    private String handlingResult;

    /**
     * 设备指纹
     *
     * <p>监控设备的指纹信息。</p>
     */
    @Column(name = "device_fingerprint", length = 128)
    private String deviceFingerprint;

    /**
     * 网络信息
     *
     * <p>网络连接信息，JSON格式。</p>
     */
    @Column(name = "network_info", columnDefinition = "TEXT")
    private String networkInfo;

    /**
     * 环境信息
     *
     * <p>考试环境信息，JSON格式。</p>
     */
    @Column(name = "environment_info", columnDefinition = "TEXT")
    private String environmentInfo;

    /**
     * 行为特征
     *
     * <p>学生的行为特征分析结果，JSON格式。</p>
     */
    @Column(name = "behavior_features", columnDefinition = "TEXT")
    private String behaviorFeatures;

    /**
     * 异常次数
     *
     * <p>累计异常次数。</p>
     */
    @Column(name = "anomaly_count")
    private Integer anomalyCount = 0;

    /**
     * 违规次数
     *
     * <p>累计违规次数。</p>
     */
    @Column(name = "violation_count")
    private Integer violationCount = 0;

    /**
     * 是否自动阻断
     *
     * <p>是否触发了自动阻断机制。</p>
     */
    @Column(name = "is_auto_blocked", nullable = false)
    private Boolean isAutoBlocked = false;

    /**
     * 阻断时间
     *
     * <p>自动阻断的时间。</p>
     */
    @Column(name = "block_time")
    private LocalDateTime blockTime;

    /**
     * 阻断原因
     *
     * <p>自动阻断的原因。</p>
     */
    @Column(name = "block_reason", columnDefinition = "TEXT")
    private String blockReason;

    /**
     * 解除阻断时间
     *
     * <p>解除阻断的时间。</p>
     */
    @Column(name = "unblock_time")
    private LocalDateTime unblockTime;

    /**
     * 监控配置
     *
     * <p>监控使用的配置参数，JSON格式。</p>
     */
    @Column(name = "monitoring_config", columnDefinition = "TEXT")
    private String monitoringConfig;

    /**
     * 监控标签
     *
     * <p>监控记录的标签，JSON格式。</p>
     */
    @Column(name = "monitoring_tags", columnDefinition = "TEXT")
    private String monitoringTags;

    /**
     * 关联事件ID
     *
     * <p>关联的安全事件ID。</p>
     */
    @Column(name = "related_event_id", length = 32)
    private String relatedEventId;

    /**
     * 证据文件路径
     *
     * <p>相关证据文件的存储路径。</p>
     */
    @Column(name = "evidence_file_path", length = 500)
    private String evidenceFilePath;

    /**
     * 审计备注
     *
     * <p>审计相关的备注信息。</p>
     */
    @Column(name = "audit_notes", columnDefinition = "TEXT")
    private String auditNotes;

    // ===== 标准审计字段 =====

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version", nullable = false)
    private Long version = 0L;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

}